// 完美转发与临时变量
// 完美转发(Perfect Forwarding)是C++11引入的一种机制，用于在函数模板中保持参数的值类别(value category)和CV限定符(const/volatile qualifiers)。处理临时变量是完美转发中的一个重要方面。

// 临时变量的特殊性
// 临时变量(temporary objects)在C++中是右值(rvalues)，它们有一些特殊的特性：
// 1.生命周期有限：通常在包含它们的完整表达式结束时销毁
// 2.不能取地址：不能获取临时变量的地址（除非绑定到引用）
// 3.可以移动：可以从临时变量中窃取资源

// 完美转发临时变量的挑战
// 当我们想要将参数（包括临时变量）从一个函数转发到另一个函数时，需要保持其原始特性：
// 不完美的转发
template <typename T>
void wrapper(T param)
{
    inner_function(param); // param总是左值，即使原始参数是右值
}

// 使用引用但仍不完美
template <typename T>
void wrapper(T &param)
{
    inner_function(param); // 不能接受右值参数（临时变量）
}

// 使用std::forward完美转发临时变量
template <typename T>
void wrapper(T &&param)
{                                           // 通用引用
    inner_function(std::forward<T>(param)); // 保持原始值类别
}

// 使用
wrapper(10); // 10是临时变量(右值)，通过完美转发保持为右值
int x = 10;
wrapper(x); // x是左值，通过完美转发保持为左值

// 临时变量的转发规则
// 1.右值引用折叠：
//      T&& && 折叠为 T&&（右值引用）
//      T& && 或 T&& & 折叠为 T&（左值引用）
// 2.模板参数推导：
//      对于左值参数，T 被推导为左值引用类型
//      对于右值参数，T 被推导为非引用类型
// 3.std::forward的工作原理：
template <typename T>
T &&forward(typename remove_reference<T>::type &arg)
{
    return static_cast<T &&>(arg);
}


